package com.elmcode.study.design.pro04_proxy.jdkProxy;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

@Slf4j
public class ProxyFactory {

    Service target;

    public ProxyFactory(Service target){
        this.target = target;
    }

    public Object getProxyObject(){

        return Proxy.newProxyInstance(
                // ClassLoader loader 类加载器，完成目标对象的加载
                target.getClass().getClassLoader(),
                // Class<?>[] interfaces 目标对象实现的所有接口
                target.getClass().getInterfaces(),
                // InvocationHandler h 实现代理功能的接口，传入匿名内部实现
                new InvocationHandler() {
                    /**
                     * @param proxy 创建代理对象
                     * @param method 目标方法
                     * @param args 目标方法的参数
                     * @return obj 目标方法的返回值
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // 代理功能
                        System.out.println("预定时间……");
                        // 代理功能
                        System.out.println("预定场地……");

                        // 主业务功能
                        // target.sing(); 这样还是写死了
                        // invoke() -- 调用 target 对象的方法
                        String  res = ((String) method.invoke(target, args));

                        // 代理功能
                        System.out.println("结算费用……");
                        return res;
                    }
                }
        );
    }


}
